home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2003 November A / PCWK1103A.iso / ABBYY FineReader 7.0 PRO / data1.cab / gs_ll3.ps < prev    next >
Text File  |  2002-04-03  |  16KB  |  469 lines

  1. %    Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
  2. % This software is provided AS-IS with no warranty, either express or
  3. % implied.
  4. % This software is distributed under license and may not be copied,
  5. % modified or distributed except as expressly authorized under the terms
  6. % of the license contained in the file LICENSE in this distribution.
  7. % For more information about licensing, please refer to
  8. % http://www.ghostscript.com/licensing/. For information on
  9. % commercial licensing, go to http://www.artifex.com/licensing/ or
  10. % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
  11. % San Rafael, CA  94903, U.S.A., +1(415)492-9861.
  12.  
  13. % $Id: gs_ll3.ps,v 1.10.2.2 2002/04/02 13:57:27 mpsuzuki Exp $
  14. % Initialization file for PostScript LanguageLevel 3 functions.
  15. % This file must be loaded after gs_lev2.ps and gs_res.ps.
  16. % These definitions go into ll3dict or various ProcSets.
  17. % NOTE: the interpreter creates ll3dict.
  18.  
  19. ll3dict begin
  20.  
  21. % We need LanguageLevel 2 or higher in order to have setuserparams and
  22. % defineresource.
  23. languagelevel dup 2 .max .setlanguagelevel
  24.  
  25. % ------ Idiom recognition ------ %
  26.  
  27. /IdiomRecognition false .definepsuserparam
  28.  
  29. % Modify `bind' to apply idiom recognition afterwards.
  30. /.bindscratch 128 string def
  31. % Do the right thing if NOBIND or DELAYBIND is in effect.
  32. % Note also that since this definition of `bind' may get bound in,
  33. % it has to function properly even at lower language levels,
  34. % where IdiomRecognition may not be defined.
  35. /bind load /.bind load ne
  36. /bind {        % <proc> bind <proc'>
  37.   //.bind currentuserparams /IdiomRecognition
  38.   .knownget not { false } if {
  39.     (*) {
  40.       /IdiomSet findresource
  41.       false exch {
  42.         % Stack: proc false dummykey [template substitute]
  43.     exch pop dup 1 get exch 0 get
  44.         % Stack: proc false substitute template
  45.     3 index .eqproc {
  46.       2 index gcheck 1 index gcheck not and {
  47.         pop
  48.       } {
  49.         3 -1 roll pop exch not exit
  50.       } ifelse
  51.     } {
  52.       pop
  53.     } ifelse
  54.       } forall { exit } if
  55.     } //.bindscratch /IdiomSet resourceforall
  56.   } if
  57. } odef
  58. { /.bind /bind load def
  59.   /bind { } def
  60. } if
  61. currentdict /.bindscratch .undef
  62.  
  63. % ------ HalftoneTypes 6, 10, 16 and HalftoneMode ------ %
  64.  
  65. % This code depends on an internal HalftoneType 7 with the following keys:
  66. %    Width, Height, Width2, Height2, TransferFunction:
  67. %      as for HalftoneType 16.
  68. %    Thresholds: a string or bytestring holding the thresholds,
  69. %      (Width x Height + Width2 x Height2) x BitsPerSample / 8 bytes,
  70. %      as for HalftoneType 16 except that the samples may be either
  71. %      8 or 16 bits wide.
  72. %    BitsPerSample: 8 or 16.
  73.  
  74. % Note that this HalftoneType never appears in halftone dictionaries given
  75. % to sethalftone, only as a component in those given to .sethalftone5,
  76. % so its numeric value can be chosen ad lib as long as it differs from the
  77. % other values that are legal in component dictionaries for .sethalftone5
  78. % (currently only 1 and 3).
  79.  
  80. /.makehalftone7 {    % <dict> <dict> <source> <Width> <Height>
  81.             %   (<Width2> <Height2> | null) <BPS> .makehalftone7
  82.             %   <setdict> <dict5> { .sethalftone5 }
  83.   8 dict begin
  84.   /HalftoneType 7 def
  85.   /BitsPerSample exch def
  86.   dup null eq {
  87.     pop 0
  88.   } {
  89.     /Height2 1 index def /Width2 2 index def mul
  90.   } ifelse 3 1 roll
  91.   /Height 1 index def
  92.   /Width 2 index def
  93.   mul add BitsPerSample 8 idiv mul .bigstring
  94.         % Stack: dict dict source str
  95.   dup type /stringtype eq { readstring } { .readbytestring } ifelse
  96.   not { /sethalftone load /rangecheck signalerror exit } if
  97.   readonly /Thresholds exch def
  98.   /TransferFunction .knownget { /TransferFunction exch def } if
  99.         % If the original Thresholds was a file, replace it with
  100.         % a new one.
  101.   dup /Thresholds get type /filetype eq {
  102.     dup /Thresholds [ Thresholds ] cvx 0 () .subfiledecode put
  103.   } if
  104.   mark /HalftoneType 5 /Default currentdict end .dicttomark
  105.   { .sethalftone5 }
  106. } bind def
  107.  
  108. /.bigstring {    % <size> .bigstring <string|bytestring>
  109.   dup 65400 gt { .bytestring } { string } ifelse
  110. } bind def
  111.  
  112. /.readbytestring {    % <source> <bytestring> .readbytestring
  113.             %   <bytestring> <filled>
  114.         % Note that since bytestrings don't implement getinterval,
  115.         % if filled is false, there is no way to tell how much
  116.         % was read.
  117.   true exch 0 1 2 index length 1 sub {
  118.         % Stack: source true str index
  119.     3 index read not { pop exch not exch exit } if
  120.     3 copy put pop pop
  121.   } for 3 -1 roll pop exch
  122. } bind def
  123.  
  124. /.sethalftone6 {    % <dict> <dict> .sethalftone6 <setdict> <dict5>
  125.             %   { .sethalftone5 }
  126.             % Keys: Width, Height, Thresholds, T'Function
  127.   dup /Thresholds get
  128.   1 index /Width get 2 index /Height get
  129.   null 8 .makehalftone7
  130. } bind def
  131.  
  132. /.sethalftone10 {    % <dict> <dict> .sethalftone10 <setdict> <dict5>
  133.             %   { .sethalftone5 }
  134.             % Keys: Xsquare, Ysquare, Thresholds, T'Function
  135.         % Note that this is the only one of these three HalftoneTypes
  136.         % that allows either a file or a string for Thresholds.
  137.   dup /Thresholds get dup type /stringtype eq { 0 () .subfiledecode } if
  138.   1 index /Xsquare get dup 3 index /Ysquare get dup
  139.   8 .makehalftone7
  140. } bind def
  141.  
  142. /.sethalftone16 {    % <dict> <dict> .sethalftone16 <setdict> <dict5>
  143.             %   { .sethalftone5 }
  144.             % Keys: Width, Height, Width2, Height2,
  145.             %   Thresholds, T'Function
  146.   dup /Thresholds get
  147.   1 index /Width get 2 index /Height get
  148.   3 index /Width2 .knownget {  % 2-rectangle case
  149.     4 index /Height2 get
  150.   } {            % 1-rectangle case
  151.     null
  152.   } ifelse 16 .makehalftone7
  153. } bind def
  154.  
  155. .halftonetypes begin
  156.   6 /.sethalftone6 load def
  157.   10 /.sethalftone10 load def
  158.   16 /.sethalftone16 load def
  159. end
  160.  
  161. % Redefine the halftone-setting operators to honor HalftoneMode.
  162. /setcolorscreen {
  163.   /HalftoneMode getuserparam 0 eq {
  164.     //setcolorscreen
  165.   } {
  166.     12 { pop } repeat .getdefaulthalftone
  167.     { //sethalftone }
  168.     { .setdefaulthalftone }
  169.     ifelse
  170.   } ifelse
  171. } odef
  172. /setscreen {
  173.   /HalftoneMode getuserparam 0 eq {
  174.     //setscreen
  175.   } {
  176.     pop pop pop .getdefaulthalftone
  177.     { //sethalftone }
  178.     { .setdefaulthalftone }
  179.     ifelse
  180.   } ifelse
  181. } odef
  182. /sethalftone {
  183.   /HalftoneMode getuserparam 0 eq {
  184.     //sethalftone
  185.   } {
  186.     pop .getdefaulthalftone
  187.     { //sethalftone }
  188.     { .setdefaulthalftone }
  189.     ifelse
  190.   } ifelse
  191. } odef
  192.  
  193. % ------ ImageTypes 3 and 4 (masked images) ------ %
  194.  
  195. .imagetypes
  196.   dup 3 /.image3 load put
  197.   dup 4 /.image4 load put
  198. % We also detect ImageType 103 here: it isn't worth making a separate file
  199. % just for this.
  200.   /.image3x where { pop dup 103 /.image3x load put } if
  201. pop
  202.  
  203. % ------ Functions ------ %
  204.  
  205. % Define the FunctionType resource category.
  206. /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  207.   /InstanceType /integertype def
  208. /FunctionType currentdict end /Category defineresource pop
  209.  
  210. {0 2 3} { dup /FunctionType defineresource pop } forall
  211.  
  212. % ------ Smooth shading ------ %
  213.  
  214. % Define the ShadingType resource category.
  215. /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  216.   /InstanceType /integertype def
  217. /ShadingType currentdict end /Category defineresource pop
  218.  
  219. systemdict /.shadingtypes mark        % not ll3dict
  220.   1 /.buildshading1 load
  221.   2 /.buildshading2 load
  222.   3 /.buildshading3 load
  223.   4 /.buildshading4 load
  224.   5 /.buildshading5 load
  225.   6 /.buildshading6 load
  226.   7 /.buildshading7 load
  227. .dicttomark put
  228.  
  229. systemdict /.reuseparamdict mark
  230.   /Intent 2
  231.   /AsyncRead false
  232.   /CloseSource true
  233. .dicttomark readonly put
  234. /.buildshading {    % <shadingdict> .buildshading <shading>
  235.         % Unfortunately, we always need to make the DataSource reusable,
  236.         % because if clipping is involved, even shfill may need to read
  237.         % the source data multiple times.  If it weren't for this,
  238.         % we would only need to create a reusable stream if the ultimate
  239.         % source of the data is a procedure (since the library can't
  240.         % suspend shading to do a procedure callout).
  241.   dup /DataSource .knownget {
  242.     dup type /filetype eq {
  243.       //.reuseparamdict /ReusableStreamDecode filter
  244.       .currentglobal 1 index gcheck .setglobal
  245.         % Stack: shdict rsdfile saveglobal
  246.       2 index dup length dict copy exch .setglobal
  247.       dup /DataSource 4 -1 roll put exch pop
  248.     } {
  249.       pop
  250.     } ifelse
  251.   } if
  252.     % The .buildshading operators use the current color space
  253.     % for ColorSpace.
  254.   dup /ShadingType get //.shadingtypes exch get
  255.   1 index /ColorSpace get setcolorspace exec
  256. } bind def
  257. systemdict /.reuseparamdict undef
  258.  
  259. /.buildpattern2 {    % <template> <matrix> .buildpattern2
  260.             %   <template> <pattern>
  261.     % We want to build the pattern without doing gsave/grestore,
  262.     % since we want it to load the CIE caches.
  263.   1 index /Shading get
  264.   mark currentcolor currentcolorspace
  265.   counttomark 4 add -3 roll mark 4 1 roll
  266.     % Stack: -mark- ..color.. cspace -mark- template matrix shadingdict
  267.   { .buildshading } stopped {
  268.     cleartomark setcolorspace setcolor pop stop
  269.   } if
  270.   .buildshadingpattern
  271.   3 -1 roll pop counttomark 1 add 2 roll setcolorspace setcolor pop
  272. } bind def
  273.  
  274. .patterntypes
  275.   2 /.buildpattern2 load put
  276.  
  277. /shfill {        % <shadingdict> shfill -
  278.     % Currently, .shfill requires that the color space
  279.     % in the pattern be the current color space.
  280.   dup gsave { .buildshading .shfill } stopped grestore { stop } if
  281.   pop
  282. } odef
  283.  
  284. % Establish an initial smoothness value that matches Adobe RIPs.
  285. 0.02 setsmoothness
  286.  
  287. % ------ UseCIEColor ------ %
  288.  
  289. % The library maintains and detects the UseCIEColor device parameter,
  290. % but it doesn't have access to the resource dictionaries.  We also
  291. % want color space substitution to work in systems without a PostScript
  292. % interpreter.  Therefore, we eagerly inform the library of changes in
  293. % the (effective) ColorSpace category that might affect the operation of
  294. % UseCIEColor.  We must notice the following events:
  295. %    1) defineresource and undefineresource of the Default ColorSpaces.
  296. %    2) restore.
  297. %    3) Changes in current VM, which cause a different set of resources
  298. %    to become visible.
  299. % #1 is rare.  #2 is handled in C code.  If checking the ColorSpace
  300. % category on #3 turns out to be expensive, we can cache more information
  301. % about whether these operations actually affect UseCIEColor.
  302.  
  303. % This operator implements color space substitution in the library:
  304. %    <index> <bool> .setsubstitutecolorspace -
  305. % <bool> = true means substitute the current color space for the one given
  306. % by <index>; <bool> = false means stop substituting.  Substitution is not
  307. % affected by grestore/setgstate, but it is affected by restore.
  308.  
  309. % ColorSpace defineresource and undefineresource for the Default keys
  310. % call .definedefaultcs and .undefinedefaultcs.  See gs_res.ps.
  311.  
  312. /.useciecolorkeydict mark
  313.   /UseCIEColor null
  314. .dicttomark readonly def
  315. /.definedefaultcs {    % <index> <value> .definedefaultcs -
  316.   currentcolorspace
  317.     % Temporarily disable color substitution, in case the substitute
  318.     % color space is or mentions a color space that is currently
  319.     %  being substituted.
  320.   currentdevice //.useciecolorkeydict .getdeviceparams exch pop exch pop
  321.   mark 5 -2 roll
  322.     % Stack: cspace UseCIEColor mark index value
  323.    { setcolorspace true .setsubstitutecolorspace }
  324.   stopped counttomark 1 add 1 roll cleartomark
  325.     % Stack: cspace UseCIEColor stopped?
  326.   3 1 roll
  327.   currentdevice null true mark /UseCIEColor 6 -1 roll .putdeviceparams pop pop
  328.   setcolorspace { stop } if
  329. } bind def
  330. currentdict /.useciecolorkeydict undef
  331.  
  332. /.undefinedefaultcs {    % <index> .undefinedefaultcs -
  333.   false .setsubstitutecolorspace
  334. } bind def
  335.  
  336. /.setdefaultcs {    % <index> <value|null> .setdefaultcs -
  337.   dup null eq { pop .undefinedefaultcs } { .definedefaultcs } ifelse
  338. } bind def
  339.  
  340. /.getdefaultcs {    % <key> .getdefaultcs <value|null>
  341.   .GetInstance { 0 get } { null } ifelse
  342. } bind def
  343.  
  344. /.setglobal {        % <bool> .setglobal -
  345.   dup .currentglobal ne {
  346.     % If there are no local definitions of the Default keys,
  347.     % changing VM can't affect the definition of any resource.
  348.     /.localcsdefaults .uservar {
  349.     % We only want to change substitutions for color spaces
  350.     % whose definitions are actually changing.
  351.       /ColorSpace /Category findresource begin
  352.       /DefaultGray .getdefaultcs
  353.       /DefaultRGB .getdefaultcs
  354.       /DefaultCMYK .getdefaultcs
  355.       end
  356.       3 index .setglobal
  357.       /ColorSpace /Category findresource begin
  358.       /DefaultGray .getdefaultcs
  359.       /DefaultRGB .getdefaultcs
  360.       /DefaultCMYK .getdefaultcs
  361.       end
  362.             % Stack: bool oldgray oldrgb oldcmyk
  363.             %   newgray newrgb newcmyk
  364.       dup 4 index ne { 2 exch .setdefaultcs } { pop } ifelse
  365.       dup 4 index ne { 1 exch .setdefaultcs } { pop } ifelse
  366.       dup 4 index ne { 0 exch .setdefaultcs } { pop } ifelse
  367.       pop pop pop pop
  368.     } {
  369.       .setglobal
  370.     } ifelse
  371.   } {
  372.     .setglobal
  373.   } ifelse
  374. } .bind odef        % bind in .setglobal
  375.  
  376.  
  377. % Define default device color spaces to allow substitution
  378. % on UseCIEColor == true :
  379.  
  380. /DefaultGray
  381. [ /CIEBasedA
  382.   3 dict begin
  383.      /WhitePoint [ 0.9505 1.0 1.089 ] def
  384.      /DecodeLMN  [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ] def
  385.      /MatrixLMN  [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
  386.   currentdict end
  387. ]
  388. /ColorSpace defineresource pop
  389.  
  390. /DefaultRGB
  391. [ /CIEBasedABC
  392.   3 dict begin
  393.      /WhitePoint [ 0.9505 1.0 1.089 ] def
  394.      /DecodeLMN  [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ]  def
  395.      /MatrixLMN  [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
  396.   currentdict end
  397. ]
  398. /ColorSpace defineresource pop
  399.  
  400. /DefaultCMYK
  401. [ /CIEBasedDEFG
  402.   4 dict begin
  403.      /WhitePoint [ 0.9505 1.0 1.089 ] def
  404.      /Table [ 2 2 2 2
  405.             % Trivial table :
  406.             % [
  407.             %   [ < FFFFFF 000000 FFFF00 000000>
  408.             %     < FF00FF 000000 FF0000 000000> ]
  409.             %   [ < 00FFFF 000000 00FF00 000000>
  410.             %     < 0000FF 000000 000000 000000> ]
  411.             % ]
  412.  
  413.             % AcrobatReader-compatible table :
  414.               [
  415.                 [ < FFFFFF 000000 FFFF00 000000>
  416.                   < EA007F 000000 FC000F 000000> ]
  417.  
  418.                 [ < 00A0C8 000000 008436 000000>
  419.                   < 00007C 000000 000000 000000> ]
  420.               ]
  421.             ] def
  422.      /DecodeLMN [ { 1.8 exp } { 1.8 exp } { 1.8 exp } ] def
  423.      /MatrixLMN [ 0.4439 0.2522 0.0436 0.3341 0.6371 0.1387 0.1725 0.1107 0.9067 ] def
  424.   currentdict end
  425. ]
  426. /ColorSpace defineresource pop
  427.  
  428.  
  429. % ------ DeviceN color space ------ %
  430.  
  431. % This isn't quite right, because the ColorSpaceFamily resource will exist
  432. % even with languagelevel < 3, but it's close enough.
  433.  
  434. /.setdevicenspace where {
  435.   pop colorspacedict /DeviceN {
  436.     dup 2 get setcolorspace dup
  437.     dup 1 get length        % # of components
  438.     .converttinttransform .setdevicenspace
  439.   } bind put
  440. } if
  441.  
  442. % ------ Miscellaneous ------ %
  443.  
  444. % Define additional user and system parameters.
  445. /HalftoneMode 0 .definepsuserparam
  446. /MaxSuperScreen 1016 .definepsuserparam
  447. pssystemparams begin        % read-only, so use .forcedef
  448.   /MaxDisplayAndSourceList 160000 .forcedef
  449. end
  450.  
  451. % Define the IdiomSet resource category.
  452. { /IdiomSet } {
  453.   /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  454.     /InstanceType /dicttype def
  455.   currentdict end /Category defineresource pop
  456. } forall
  457.  
  458. /languagelevel 3 def
  459. % When running in LanguageLevel 3 mode, this interpreter is supposed to be
  460. % compatible with Adobe version 3010.
  461. /version (3010) readonly def
  462.  
  463. .setlanguagelevel
  464.  
  465. end            % ll3dict
  466.